package com.sh.stream.test;

import com.sh.stream.po.Person;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class StreamExample {
    public static void main(String[] args) {
        // 创建一个包含 Person 对象的列表
        List<Person> people = new ArrayList<>();
        people.add(new Person("Alice", 25));
        people.add(new Person("Bob", 30));
        people.add(new Person("Charlie", 22));
        people.add(new Person("David", 35));

        // 使用 Stream API 进行一系列操作

        // 1. 过滤出年龄大于等于 30 的人
        List<Person> olderPeople = people.stream()
                // filter 是中间操作，用于过滤满足条件的元素
               .filter(person -> person.getAge() >= 30)
                // collect 是终端操作，将流转换为列表
               .collect(Collectors.toList());
        System.out.println("People aged 30 or above:");
        olderPeople.forEach(person -> System.out.println(person.getName() + " - " + person.getAge()));

        // 2. 将所有人的年龄加 5
        List<Integer> newAges = people.stream()
                // map 是中间操作，用于对每个元素进行转换
               .map(person -> person.getAge() + 5)
               .collect(Collectors.toList());
        System.out.println("\nAges after adding 5:");
        newAges.forEach(age -> System.out.println(age));

        // 3. 计算所有人年龄的总和
        int totalAge = people.stream()
                // mapToInt 将 Stream<Person> 转换为 IntStream
               .mapToInt(Person::getAge)
                // sum 是终端操作，计算总和
               .sum();
        System.out.println("\nTotal age of all people: " + totalAge);

        // 4. 获取所有人的名字列表
        List<String> names = people.stream()
                // map 用于提取每个人的名字
                /**
                 * map方法是 Java 8 Stream API 中的一个中间操作方法，其主要作用是对 Stream 中的每个元素进行转换操作。
                 * 它接受一个函数作为参数，这个函数将输入类型的元素转换为输出类型的元素。
                 */
               .map(Person::getName)
               .collect(Collectors.toList());
        System.out.println("\nNames of all people:");
        names.forEach(name -> System.out.println(name));
    }
}